#ifndef API_SERVICE_
#define API_SERVICE_

[["python:pkgdir:qy/qyalgotrader/utils/apiservice"]]
module qy
{
	module qyalgotrader
	{
		module utils
		{
			module apiservice
			{
				/**
				 * sequence<string>
				 */
				sequence<string> StringSeq;
				/**
				 * sequence<sequence<string>>
				 */
				sequence<StringSeq> StringSeqSeq;
				/**
				 * dictionary<string, string>
				 */
				dictionary<string, string> StringDict;
				/**
				 * <pre>
				 * String
				 * Double
				 * Int
				 * Long
				 * Date
				 * Time
				 * DateTime
				 * </pre>
				 */
				enum FieldDataType { String = 0, Double = 1, Int = 2, Long = 3, Date = 4, Time = 5, DateTime = 6 }
				/**
				 * 类型信息: 类型 + 格式
				 */
				struct FieldTypeInfo {
					/**
					 * 数据类型 (枚举值: FieldDataType)
					 */
					string dataType;
					/**
					 * 格式描述
					 */
					string fmt;
				}
				/**
				 * sequence<FieldTypeInfo>
				 */
				sequence<FieldTypeInfo> FieldTypes;

				/**
				 * Wind Quant Api
				 */
				module wind
				{
					struct WindData
					{
						/**
						 * 错误码
						 */
						long errorCode;
						/**
						 * 返回订阅的请求 id
						 */
						long requestId;
						/**
						 * WindCode 列表
						 */
						StringSeq codes;
						/**
						 * 指标列表
						 */
						StringSeq fields;
						/**
						 * 时间列表
						 */
						StringSeq times;
						/**
						 * 指标数据类型
						 */
						StringSeq fieldDataTypes;
						/**
						 * 数据
						 */
						StringSeqSeq data;
					}

					interface WsqCallBack
					{
						/**
						 * 回调函数定义
						 */
						void cbf(WindData windData);
					}

					interface Wapi
					{
						/**
						 * <pre>
						 * Wind 接口启动函数
						 * [in] timeout: ms; defult: 9,000
						 * </pre>
						 */
						WindData start(optional(1) long timeout);
						/**
						 * Wind 接口终止函数
						 */
						void stop();
						/**
						 * 判断连接状态
						 */
						idempotent bool isconnected();

						/**
						 * <pre>
						 * 多值函数 wsd, 获取日期序列:
						 * [in] codes: comma-separated
						 * [in] fields: comma-separated
						 * notes: 获取多个证券数据时, fields 只能选择一个
						 * [in] beginDate: YYYY-MM-DD
						 * [in] endDate: YYYY-MM-DD
						 * [in] options: default: ""
						 * </pre>
						 */
						idempotent WindData wsd(string codes, string fields, optional(1) string beginDate, optional(2) string endDate,
								optional(3) string options);
						/**
						 * <pre>
						 * 多值函数 wss, 获取历史快照:
						 * [in] codes: comma-separated
						 * [in] fields: comma-separated
						 * [in] options: default: ""
						 * </pre>
						 */
						idempotent WindData wss(string codes, string fields, optional(1) string options);
						/**
						 * <pre>
						 * 多值函数 wsi, 获取分钟序列:
						 * [in] codes: comma-separated
						 * [in] fields: comma-separated
						 * [in] beginTime: YYYY-MM-DD HH:MM:SS
						 * [in] endTime: YYYY-MM-DD HH:MM:SS
						 * [in] options: default: ""
						 * </pre>
						 */
						idempotent WindData wsi(string codes, string fields, string beginTime, string endTime,
								optional(1) string options);
						/**
						 * <pre>
						 * 多值函数 wst, 获取日内跳价:
						 * [in] code: 仅支持单品种
						 * [in] fields: comma-separated
						 * [in] beginTime: YYYY-MM-DD HH:MM:SS
						 * [in] endTime: YYYY-MM-DD HH:MM:SS
						 * [in] options: default: ""
						 * </pre>
						 */
						idempotent WindData wst(string code, string fields, string beginTime, string endTime,
								optional(1) string options);
						/**
						 * <pre>
						 * 多值函数 wsq, 获取实时行情: 非订阅模式, 取一次性快照数据:
						 * [in] codes: comma-separated
						 * [in] fields: comma-separated
						 * [in] options: default: ""
						 * </pre>
						 */
						WindData wsq(string codes, string fields, optional(1) string options);
						/**
						 * <pre>
						 * 多值函数 wsq, 获取实时行情: 订阅模式, 订阅实时数据, 数据通过回调函数返回:
						 * [in] codes: comma-separated
						 * [in] fields: comma-separated
						 * [in] cb: WsqCallBack proxy passed by the client
						 * [in] options: default: ""
						 * </pre>
						 */
						WindData wsqSubscribe(string codes, string fields, WsqCallBack* cb, optional(1) string options);
						/**
						 * <pre>
						 * 取消实时行情订阅函数:
						 * [in] requestId: default: 0 (取消所有订阅)
						 * </pre>
						 */
						void wsqCancalSubscribe(optional(1) long requestId);

						/**
						 * <pre>
						 * 多值函数 wset, 获取指定数据集:
						 * [in] tableName
						 * [in] options: default: ""
						 * </pre>
						 */
						idempotent WindData wset(string tableName, optional(1) string options);

						/**
						 * <pre>
						 * 日历日, 工作日, 交易日的日期序列函数
						 * [in] beginDate: YYYY-MM-DD
						 * [in] endDate: YYYY-MM-DD
						 * [in] options: default: ""
						 * </pre>
						 */
						idempotent WindData tdays(string beginDate, string endDate, optional(1) string options);
						/**
						 * <pre>
						 * 日历日, 工作日, 交易日的日期偏移计算
						 * [in] offset:
						 * [in] beginDate: YYYY-MM-DD
						 * [in] options: default: ""
						 * [out] wd:
						 * </pre>
						 */
						idempotent string tdaysoffset(int offset, string beginDate, optional(1) string options,
								out WindData wd);
						/**
						 * <pre>
						 * 日历日, 工作日, 交易日的日期天数计算
						 * [in] beginDate: YYYY-MM-DD
						 * [in] endDate: YYYY-MM-DD
						 * [in] options: default: ""
						 * [out] wd:
						 * </pre>
						 */
						idempotent int tdayscount(string beginDate, string endDate, optional(1) string options,
								out WindData wd);
					}
				}

				/**
				 * tushare
				 */
				module ts
				{
					/**
					 * 封装返回的 pandas.DataFrame
					 */
					struct TsData
					{
						/**
						 * 错误码
						 */
						long errorCode;
						/**
						 * 错误信息
						 */
						string errorMsg;
						/**
						 * code 列表
						 */
						StringSeq codes;
						/**
						 * DataFrame 列名称
						 */
						StringSeq colNames;
						/**
						 * DataFrame indexes
						 */
						StringSeq indexes;
						/**
						 * 列数据类型
						 */
						FieldTypes fieldDataTypes;
						/**
						 * 数据
						 */
						StringSeqSeq data;
					}

					/**
					 * <pre>
					 * http://tushare.org
					 * https://github.com/waditu/tushare
					 *
					 * import tushare as ts
					 * </pre>
					 */
					interface Tushare
					{
						/**
						 * <pre>
						 * 获取历史分笔数据 (只能获取当前交易日之前的数据):
						 * [in] code: e.g.: "601398"
						 * [in] date: YYYY-MM-DD
						 * [in] retryCount: default: 3
						 * [in] pause: default: 0.001
						 * [in] src: default: "sn" (新浪财经); "tt" (腾讯股票); "nt" (网易财经)
						 * [out] fields:
						 *     time (时间)
						 *     price (成交价格)
						 *     change (价格变动)
						 *     volume (成交手)
						 *     amount (成交金额(元))
						 *     type (买卖类型: 买盘, 卖盘, 中性盘)
						 * </pre>
						 */
						TsData getTickData(string code, string date, optional(1) int retryCount, optional(2) double pause,
								optional(3) string src);
						/**
						 * <pre>
						 * 获取实时分笔数据:
						 * [in] symbols: e.g.: ["601398", "000001", "hs300", ...]
						 * [out] fields:
						 *     0: name (股票名字)
						 *     1: open (今日开盘价)
						 *     2: pre_close (昨日收盘价)
						 *     3: price (当前价格)
						 *     4: high (今日最高价)
						 *     5: low (今日最低价)
						 *     6: bid (竞买价, 即 "买一" 报价)
						 *     7: ask (竞卖价, 即 "卖一" 报价)
						 *     8: volume (成交量 maybe you need do volume / 100)
						 *     9: amount (成交金额 (元 CNY))
						 *     10: b1_v (委买一 (笔数 bid volume))
						 *     11: b1_p (委买一 (价格 bid price))
						 *     12: b2_v (买二量)
						 *     13: b2_p (买二价)
						 *     14: b3_v (买三量)
						 *     15: b3_p (买三价)
						 *     16: b4_v (买四量)
						 *     17: b4_p (买四价)
						 *     18: b5_v (买五量)
						 *     19: b5_p (买五价)
						 *     20: a1_v (委卖一 (笔数 ask volume))
						 *     21: a1_p (委卖一 (价格 ask price))
						 *     ...
						 *     30: date (今日最低价)
						 *     31: time (今日最低价)
						 *     32: code (标的代码)
						 * </pre>
						 */
						TsData getRealtimeQuotes(StringSeq symbols);
						/**
						 * <pre>
						 * 获取当前交易日 (交易进行中使用) 已经产生的分笔明细数据:
						 * [in] code: e.g.: "601398"
						 * [in] retryCount: default: 3
						 * [in] pause: default: 0.001
						 * [out] fields:
						 *     time (时间)
						 *     price (成交价格)
						 *     pchange (涨跌幅)
						 *     change (价格变动)
						 *     volume (成交手)
						 *     amount (成交金额(元))
						 *     type (买卖类型: 买盘, 卖盘, 中性盘)
						 * </pre>
						 */
						TsData getTodayTicks(string code, optional(1) int retryCount, optional(2) double pause);
					}
				}

				/**
				 * CTP
				 */
				module ctp
				{

				}

				/**
				 * XTP
				 */
				module xtp
				{

				}

				/**
				 * TTS
				 */
				module tts
				{
					/**
					 * <pre>
					 * MSG
					 * PAUSE
					 * RESUME
					 * STOP
					 * CLEAR
					 * RESET
					 * </pre>
					 */
					enum TtsCmdType { MSG = 0, PAUSE = 1, RESUME = 2, STOP = 3, CLEAR = 4, RESET = 5}
					/**
					 * TTS service:
					 */
					interface TtsService
					{
						/**
						 * <pre>
						 * TTS 播报请求:
						 * [in] cmdType: 取值: enum TtsCmdType
						 * [in] cmd: 播报的语音消息
						 * </pre>
						 */
						void request(string cmdType, string cmd);
					}
				}

				/**
				 * Wrapper for Matplotlib:
				 */
				module mplwrap
				{

				}

				/**
				 * view:
				 */
				module view
				{
					/**
					 * MS Excel view:
					 */
					interface ExcelView
					{
						/**
						 * 
						 */
						string getParam(string key);
						/**
						 * 
						 */
						void setParam(string key, string val);
						/**
						 * 
						 */
						void show();
						/**
						 * 
						 */
						void hide();
						/**
						 * 
						 */
						bool isRunning();
						/**
						 * 
						 */
						string getViewName();
						/**
						 * 
						 */
						string getMode();
						/**
						 * <excel-file-name, worksheet-name, mode>
						 */
						string getDistinguishedName();
						/**
						 * 
						 */
						void start();
						/**
						 * 
						 */
						void stop();
						/**
						 * 
						 */
						void destroy();
						/**
						 * 
						 */
						StringSeq getKeyList();
						/**
						 * 
						 */
						void autoConfigure(string keyColName, StringDict indicatorNameMapping, StringDict paramsByName);
						/**
						 * 
						 */
						bool isRenderable(string indicatorName);
						/**
						 * 
						 */
						void render(string recKey, string indicatorName, string value, optional(1) bool useAbsRef);
						/**
						 * 
						 */
						void renderBatch(StringSeq recKeys, StringSeq indicatorNames, StringSeq values, optional(1) bool useAbsRef);
						/**
						 * 
						 */
						void refresh();
					}
				}
			}
		}
	}
}

#endif
